package org.yelongframework.excel.data.fill.sheet.manager;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yelongframework.excel.data.fill.sheet.SheetDataFillException;
import org.yelongframework.excel.data.fill.sheet.SheetDataFillMode;
import org.yelongframework.excel.data.fill.sheet.SheetDataFillScheme;
import org.yelongframework.excel.data.fill.sheet.SheetDataFiller;
import org.yelongframework.excel.sheet.ExcelSheet;

/**
 * 默认实现
 * 
 * @since 1.0.0
 */
public class DefaultSheetDataFillerManager implements SheetDataFillerManager {

	private static final Logger log = LoggerFactory.getLogger(DefaultSheetDataFillerManager.class);

	/** 工作表数据填充器映射 */
	private final Map<SheetDataFillMode, SheetDataFiller> sheetDataFillerMap = new HashMap<>();

	// ==================================================注册==================================================

	@Override
	public void registerSheetDataFiller(SheetDataFiller sheetDataFiller) {
		SheetDataFillMode sheetDataFillMode = sheetDataFiller.getSheetDataFillMode();
		SheetDataFiller sourceSheetDataFiller = getSheetDataFiller(sheetDataFillMode);
		if (null != sourceSheetDataFiller) {
			log.info("数据填充器模式【" + sheetDataFillMode + "】已存在【" + sourceSheetDataFiller + "】。以替换为【" + sheetDataFiller
					+ "】");
		}
		sheetDataFillerMap.put(sheetDataFillMode, sheetDataFiller);
	}

	@Override
	public void registerSheetDataFillers(List<SheetDataFiller> sheetDataFillers) {
		sheetDataFillers.forEach(this::registerSheetDataFiller);
	}

	// ==================================================获取==================================================

	@Override
	public SheetDataFiller getSheetDataFiller(SheetDataFillMode sheetDataFillMode) {
		return sheetDataFillerMap.get(sheetDataFillMode);
	}

	// ==================================================数据填充==================================================

	@Override
	public void dataFill(ExcelSheet excelSheet, SheetDataFillScheme sheetDataFillScheme) throws SheetDataFillException {
		SheetDataFillMode sheetDataFillMode = sheetDataFillScheme.getSheetDataFillMode();
		SheetDataFiller sheetDataFiller = getSheetDataFiller(sheetDataFillMode);
		if (null == sheetDataFiller) {
			throw new SheetDataFillException("没有找到数据填充模式【" + sheetDataFillMode.name() + "】对应的填充器");
		}
		sheetDataFiller.dataFill(excelSheet, sheetDataFillScheme);
	}

}
